/**
 * 视频工具函数
 * 用于处理视频相关操作，如生成视频截图等
 */

/**
 * 从视频URL生成指定时间点的截图
 * @param {string} videoUrl - 视频URL
 * @param {number} timeInSeconds - 截图时间点（秒），默认为10秒
 * @param {number} width - 截图宽度，默认为800
 * @param {number} height - 截图高度，默认为450
 * @returns {Promise<string>} - 返回base64格式的图片数据URL
 */
export function generateVideoThumbnail(videoUrl, timeInSeconds = 10, width = 800, height = 450) {
  return new Promise((resolve, reject) => {
    // 创建video元素
    const video = document.createElement('video')
    video.crossOrigin = 'anonymous'
    video.preload = 'metadata'
    
    // 创建canvas元素用于截图
    const canvas = document.createElement('canvas')
    const ctx = canvas.getContext('2d')
    canvas.width = width
    canvas.height = height
    
    // 视频加载完成后的处理
    video.addEventListener('loadedmetadata', () => {
      // 确保时间点不超过视频总长度
      const seekTime = Math.min(timeInSeconds, video.duration - 1)
      video.currentTime = seekTime
    })
    
    // 视频seek完成后截图
    video.addEventListener('seeked', () => {
      try {
        // 将视频帧绘制到canvas上
        ctx.drawImage(video, 0, 0, width, height)
        
        // 转换为base64图片数据
        const dataURL = canvas.toDataURL('image/jpeg', 0.8)
        
        // 清理资源
        video.remove()
        canvas.remove()
        
        resolve(dataURL)
      } catch (error) {
        console.error('生成视频截图失败:', error)
        reject(error)
      }
    })
    
    // 错误处理
    video.addEventListener('error', (error) => {
      console.error('视频加载失败:', error)
      video.remove()
      canvas.remove()
      reject(error)
    })
    
    // 设置视频源并开始加载
    video.src = videoUrl
    video.load()
  })
}

/**
 * 批量生成多个视频的缩略图
 * @param {Array} videoUrls - 视频URL数组
 * @param {number} timeInSeconds - 截图时间点（秒），默认为10秒
 * @param {number} width - 截图宽度，默认为400
 * @param {number} height - 截图高度，默认为225
 * @returns {Promise<Array>} - 返回包含base64图片数据的数组
 */
export async function generateMultipleVideoThumbnails(videoUrls, timeInSeconds = 10, width = 400, height = 225) {
  const promises = videoUrls.map(url => 
    generateVideoThumbnail(url, timeInSeconds, width, height)
      .catch(error => {
        console.warn(`生成视频缩略图失败 (${url}):`, error)
        return null // 失败时返回null
      })
  )
  
  return Promise.all(promises)
}

/**
 * 检查视频是否可以播放
 * @param {string} videoUrl - 视频URL
 * @returns {Promise<boolean>} - 返回视频是否可播放
 */
export function checkVideoPlayable(videoUrl) {
  return new Promise((resolve) => {
    const video = document.createElement('video')
    video.preload = 'metadata'
    
    video.addEventListener('loadedmetadata', () => {
      video.remove()
      resolve(true)
    })
    
    video.addEventListener('error', () => {
      video.remove()
      resolve(false)
    })
    
    // 设置超时，避免长时间等待
    setTimeout(() => {
      video.remove()
      resolve(false)
    }, 5000)
    
    video.src = videoUrl
    video.load()
  })
}

/**
 * 缓存视频缩略图
 */
class VideoThumbnailCache {
  constructor() {
    this.cache = new Map()
    this.maxSize = 50 // 最大缓存数量
  }
  
  /**
   * 获取缓存的缩略图
   * @param {string} videoUrl - 视频URL
   * @param {number} timeInSeconds - 时间点
   * @returns {string|null} - 缓存的base64图片数据或null
   */
  get(videoUrl, timeInSeconds = 10) {
    const key = `${videoUrl}_${timeInSeconds}`
    return this.cache.get(key) || null
  }
  
  /**
   * 设置缓存的缩略图
   * @param {string} videoUrl - 视频URL
   * @param {number} timeInSeconds - 时间点
   * @param {string} thumbnail - base64图片数据
   */
  set(videoUrl, timeInSeconds = 10, thumbnail) {
    const key = `${videoUrl}_${timeInSeconds}`
    
    // 如果缓存已满，删除最旧的条目
    if (this.cache.size >= this.maxSize) {
      const firstKey = this.cache.keys().next().value
      this.cache.delete(firstKey)
    }
    
    this.cache.set(key, thumbnail)
  }
  
  /**
   * 清空缓存
   */
  clear() {
    this.cache.clear()
  }
}

// 创建全局缓存实例
export const thumbnailCache = new VideoThumbnailCache()

/**
 * 带缓存的视频缩略图生成函数
 * @param {string} videoUrl - 视频URL
 * @param {number} timeInSeconds - 截图时间点（秒），默认为10秒
 * @param {number} width - 截图宽度，默认为800
 * @param {number} height - 截图高度，默认为450
 * @returns {Promise<string>} - 返回base64格式的图片数据URL
 */
export async function generateVideoThumbnailWithCache(videoUrl, timeInSeconds = 10, width = 800, height = 450) {
  // 先检查缓存
  const cached = thumbnailCache.get(videoUrl, timeInSeconds)
  if (cached) {
    return cached
  }
  
  try {
    // 生成新的缩略图
    const thumbnail = await generateVideoThumbnail(videoUrl, timeInSeconds, width, height)
    
    // 存入缓存
    thumbnailCache.set(videoUrl, timeInSeconds, thumbnail)
    
    return thumbnail
  } catch (error) {
    console.error('生成视频缩略图失败:', error)
    throw error
  }
}